﻿using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using ClassLibraryEntidades;
using ClassLibraryServer.Negocio;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Collections.Generic;
using ClassLibraryEntidades;


[WebService(Namespace = "http://ecoway.blogdns.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
    public Service()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    #region Métodos públicos

    [WebMethod]
    /// <summary>
    /// Comprueba si hay conexión
    /// </summary>
    public bool TestConexion()
    {
        return true;
    }



    [WebMethod]
    /*
        Dada una BusquedaNatural, devuelve la Ruta correspondiente
    */
    public byte[] RealizarBusquedaPorDireccion(byte[] bytes_busquedaNaturaPorDirecciones)
    {

        BusquedaNatural busquedaNaturaPorDirecciones = (BusquedaNatural)Serializador.DeserializarObjeto(bytes_busquedaNaturaPorDirecciones, typeof(BusquedaNatural));


        CalculoRuta algoritmoBusqueda = new AlgoritmoRutaExpress(Server.MapPath("searches.data"));

        
        Ruta rutaResult = algoritmoBusqueda.CalcularRuta(busquedaNaturaPorDirecciones);

        return Serializador.SerializarObjeto(rutaResult);
    }

    private Ruta DameRuta()
    {
        //BusquedaTopologica busquedaTopologica = MapeadorBusqueda.Instance.DameBusquedaTopologica(origen, destino);
        //CalculoRuta calculoRuta = new AlgoritmoRutaUno();

        //Creo las coordenadas de los diferentes nodos
        Coordenada c1 = new Coordenada(10, 50);
        Coordenada c2 = new Coordenada(40, 70);
        Coordenada c3 = new Coordenada(80, 100);
        Coordenada c4 = new Coordenada(80, 130);
        Coordenada c5 = new Coordenada(30, 170);

        //Creo las direcciones
        Direccion dir = new Direccion("a", 2);

        //Creo los nodos
        Nodo a = new Nodo(c1, dir);
        Nodo b = new Nodo(c2, dir);
        Nodo c = new Nodo(c3, dir);
        Nodo d = new Nodo(c4, dir);
        Nodo e = new Nodo(c5, dir);

        //Creo los arcos
        List<Arco> arcos = new List<Arco>(4);

        Arco ar1 = new Arco(a, b);
        Arco ar2 = new Arco(b, c);
        Arco ar3 = new Arco(c, d);
        Arco ar4 = new Arco(d, e);

        arcos.Add(ar1);
        arcos.Add(ar2);
        arcos.Add(ar3);
        arcos.Add(ar4);

        //Creo la ruta que devuelvo
        Ruta rut = new Ruta("Ecologica",arcos);



        //Ruta rutaResult = calculoRuta.CalcularRuta(busquedaTopologica);
        return rut;
    }

    [WebMethod]
    /*
        Dada una Coordenada (PuntoNatural) devuelve un mapa que contenga a dicha coordenada.
    */
    public byte[] DameMapa(byte[] bytes_coordenada)
    {
        Coordenada coordenada = (Coordenada)Serializador.DeserializarObjeto(bytes_coordenada, typeof(Coordenada));


        GestorTopologia.directorio_mapas = Server.MapPath(@"maps\\");
        Mapa mapa = GestorTopologia.Instance.DameMapa(coordenada);



        byte[] result = Serializador.SerializarObjeto(mapa);

        return result;
    }


    [WebMethod]
    /*
     * Comprueba si el usuario y password existen
     */
    public bool LoginUsuario(string usuario, string password)
    {
        return GestorUsuarios.Instance.LoginUsuario(usuario, password);
    }

    [WebMethod]
    /*
     * Añade un nuevo registro de usuario y no esta ya en el sistema.
     */
    public bool NuevoUsuario(string usuario, string password)
    {
        return GestorUsuarios.Instance.NuevoUsuario(usuario, password);
    }

    #endregion


    #region Metodos auxiliares

    [WebMethod]
    /// <summary>
    /// Comprueba si hay conexión
    /// </summary>
    public string FileSearchesServer()
    {
        return Server.MapPath("searches.data");
    }

    #endregion

}
